﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using BLL;
using Exceptions;

namespace WCF
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "WCFContacto" in code, svc and config file together.
    public class WCFContacto : IWCFContacto
    {
        public List<DTO.Contacto> list()
        {
            BLLContacto bllContactos = new BLLContacto();
            List<BTO.Contacto> btoContactos = bllContactos.list();
            List<DTO.Contacto> dtoContactos = new List<DTO.Contacto>();
            DTO.Contacto dtoContacto;

            foreach (BTO.Contacto btoContacto in btoContactos)
            {
                dtoContacto = new DTO.Contacto();
                dtoContacto.IDContacto = btoContacto.IDContacto;
                dtoContacto.IDCliente = btoContacto.IDCliente;
                dtoContacto.IDAgencia = btoContacto.IDAgencia;
                dtoContacto.nome = btoContacto.nome;
                dtoContacto.descricao = btoContacto.descricao;
                dtoContacto.telefone = btoContacto.telefone;

                dtoContactos.Add(dtoContacto);
            }

            return dtoContactos;
        }

        public DTO.Contacto getByID(int id)
        {
            BLLContacto bllContactos = new BLLContacto();
            DTO.Contacto dtoContacto = new DTO.Contacto();

            try
            {
                BTO.Contacto btoContacto = bllContactos.getByID(id);

                dtoContacto.IDContacto = btoContacto.IDContacto;
                dtoContacto.IDCliente = btoContacto.IDCliente;
                dtoContacto.IDAgencia = btoContacto.IDAgencia;
                dtoContacto.nome = btoContacto.nome;
                dtoContacto.descricao = btoContacto.descricao;
                dtoContacto.telefone = btoContacto.telefone;

            }
            catch (NotFoundContactoException e)
            {
                throw new NotFoundContactoException(e.Message);
            }
            catch (Exception)
            {
                throw new Exception("Contacto não encontrado!");
            }

            return dtoContacto;
        }

        public List<DTO.Contacto> getByCliente(int? idCliente)
        {
            BLLContacto bllContactos = new BLLContacto();
            List<DTO.Contacto> dtoContactos = new List<DTO.Contacto>();
            DTO.Contacto dtoContacto;

            try
            {
                List<BTO.Contacto> btoContactos = bllContactos.getByCliente(idCliente);

                foreach (BTO.Contacto btoContacto in btoContactos)
                {
                    dtoContacto = new DTO.Contacto();
                    dtoContacto.IDContacto = btoContacto.IDContacto;
                    dtoContacto.IDCliente = btoContacto.IDCliente;
                    dtoContacto.IDAgencia = btoContacto.IDAgencia;
                    dtoContacto.nome = btoContacto.nome;
                    dtoContacto.descricao = btoContacto.descricao;
                    dtoContacto.telefone = btoContacto.telefone;

                    dtoContactos.Add(dtoContacto);
                }
            }
            catch (NotFoundContactoException e)
            {
                throw new NotFoundContactoException(e.Message);
            }
            catch (Exception)
            {
                throw new Exception("Nenhum contacto não encontrado!");
            }

            return dtoContactos;
        }

        public List<DTO.Contacto> getByAgencia(int idAgencia)
        {
            BLLContacto bllContactos = new BLLContacto();
            List<DTO.Contacto> dtoContactos = new List<DTO.Contacto>();
            DTO.Contacto dtoContacto;

            try
            {
                List<BTO.Contacto> btoContactos = bllContactos.getByAgencia(idAgencia);

                foreach (BTO.Contacto btoContacto in btoContactos)
                {
                    dtoContacto = new DTO.Contacto();
                    dtoContacto.IDContacto = btoContacto.IDContacto;
                    dtoContacto.IDCliente = btoContacto.IDCliente;
                    dtoContacto.IDAgencia = btoContacto.IDAgencia;
                    dtoContacto.nome = btoContacto.nome;
                    dtoContacto.descricao = btoContacto.descricao;
                    dtoContacto.telefone = btoContacto.telefone;

                    dtoContactos.Add(dtoContacto);
                }
            }
            catch (NotFoundContactoException e)
            {
                throw new NotFoundContactoException(e.Message);
            }
            catch (Exception)
            {
                throw new Exception("Nenhum contacto não encontrado!");
            }

            return dtoContactos;
        }

        public void insert(DTO.Contacto toInsert)
        {

            BLLContacto bllContacto = new BLLContacto();
            BTO.Contacto btoContacto;

            btoContacto = new BTO.Contacto();
            btoContacto.IDCliente = toInsert.IDCliente;
            btoContacto.IDAgencia = toInsert.IDAgencia;
            btoContacto.nome = toInsert.nome;
            btoContacto.descricao = toInsert.descricao;
            btoContacto.telefone = toInsert.telefone;

            try
            {
                bllContacto.insert(btoContacto);
            }
            catch (InsertContactoException e)
            {
                throw new InsertContactoException(e.Message);
            }
            catch (Exception)
            {
                throw new Exception("Erro ao inserir contacto!");
            }
        }

        public void delete(int id)
        {
            BLLContacto bllContacto = new BLLContacto();

            try
            {
                bllContacto.delete(id);
            }
            catch (DeleteContactoException e)
            {
                throw new DeleteContactoException(e.Message);
            }

            catch (Exception)
            {
                throw new Exception("Erro ao remover contacto!");
            }
        }
    }
}
